import { logger, MCPServerConfig } from "mcp-framework";
import { SSEMCPServer } from "./main/SSEMCPServer.js";
import { StdioMCPServer } from "./main/StdioMCPServer.js";
import { clearLog } from "./utils/clear_log.js";
import { clearMd } from "./utils/clear_md.js";
import yargs from "yargs";
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import { readFileSync } from 'fs';
import { DingTalkBrowser } from "./tools/GetDsWebDocTool.js";
import { HTTPMCPServer } from "./main/HTTPMCPServer.js";

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf8'));

const name = packageJson.name;
const version = packageJson.version;

const basePath = join(__dirname, process.env.NODE_ENV === 'development' ? 'dist' : '');

const argv = yargs(process.argv.slice(2))
    .example('$0 --stdio', '使用 stdio 传输模式启动服务')
    .example('$0 --sse --port 9878', '使用 SSE 传输模式在端口 9878 启动服务')
    .example('$0 --http --port 9878', '使用 http-stream 传输模式在端口 9878 启动服务')
    .example('$0 --stdio --clearlog 0 --clearmd 1', '启动服务，并且清除所有日志，让文档缓存保留一天')
    .epilogue('日志和缓存基于运行的命令运行的目录，如果在cursor中运行则是cursor的安装目录')
    .option('stdio', {
        description: '是否使用stdio传输',
        type: 'boolean',
        default: true
    })
    .option('sse', {
        description: '是否使用sse传输',
        type: 'boolean',
    })
    .option('http', {
        description: '是否使用http-stream传输',
        type: 'boolean',
    })
    .option('port', {
        alias: 'p',
        description: 'sse使用的端口号',
        type: 'number'
    })
    .option('showbrowser', {
        description: '是否显示浏览器',
        type: 'boolean'
    })
    .option('closelog', {
        description: '是否关闭日志',
        type: 'boolean',
        default: true
    })
    .option('clearlog', {
        description: '设置清理多少天前日志的时间，为0则将所有的日志清除;',
        type: 'number',
        default: 1
    })
    .option('clearmd', {
        description: '设置清理多少天前md缓存的时间，为0则将所有的md缓存清除',
        type: 'number',
        default: 10
    })
    .option('cachepath', {
        description: '设置md、cookie缓存路径，请使用绝对路径',
        type: 'string',
    })
    .help('h')
    .alias('h', 'help')
    .version('v', '版本信息', version)
    .alias('v', 'version')
    .parseSync();


if(!argv.cachepath) {
   logger.error('请使用 --cachepath 参数设置缓存路径');
   process.exit(1);
}

/** 为工具注入参数 */
DingTalkBrowser.argv = argv

if (argv.closelog) {
    logger.close()
}

const sseConfig: MCPServerConfig = {
    name: name,
    version: version,
    basePath: basePath,
    transport: {
        type: "sse",
        options: {
            port: argv.port || 9878,                // Port to listen on (default: 8080)
            endpoint: "/sse",          // SSE endpoint path (default: "/sse")
            messageEndpoint: "/messages", // Message endpoint path (default: "/messages")
            maxMessageSize: "4mb",     // Maximum message size (default: "4mb")
            cors: {                    // CORS configuration
                allowOrigin: "*",
                allowMethods: "GET, POST, OPTIONS",
                allowHeaders: "Content-Type, Authorization, x-api-key",
                exposeHeaders: "Content-Type, Authorization, x-api-key",
                maxAge: "86400"
            },
        }
    },
}

const stdioConfig: MCPServerConfig = {
    name: name,
    version: version,
    basePath: basePath,
    transport: {
        type: 'stdio',
    },
}

const httpConfig: MCPServerConfig = {
    name: name,
    version: version,
    basePath: basePath,
    transport: {
        type: 'http-stream',
        options: {
            port: argv.port || 9878,
            endpoint: "/mcp",
            responseMode: "batch",
            maxMessageSize: "4mb",
            batchTimeout: 30000,
        },
        // @ts-ignore
        cors: {                    // CORS configuration
            allowOrigin: "*",
            allowMethods: "GET, POST, DELETE, OPTIONS",
            allowHeaders: "Content-Type, Accept, Authorization, x-api-key, Mcp-Session-Id, Last-Event-ID",
            exposeHeaders: "Content-Type, Authorization, x-api-key, Mcp-Session-Id",
            maxAge: "86400"
        },
    },
}


logger.info(`获取到参数: ${JSON.stringify(argv)}`);
logger.info(`开始清理日志: ${logger.getLogPath()}`);
clearLog(argv.clearlog).catch((err) => {
    logger.error(err);
});
logger.info(`开始清理MD缓存: ${join(__dirname, '..', 'download_md')}`);
clearMd(argv.clearmd).catch((err) => {
    logger.error(err);
});

if (argv.sse) {
    new SSEMCPServer(sseConfig).start().catch((err) => {
        logger.error(err);
    });
} else if (argv.http) {
    const server = new HTTPMCPServer(httpConfig);
    server.start().catch((err) => {
        logger.error(err);
    });
} else if (argv.stdio) {
    const server = new StdioMCPServer(stdioConfig);
    server.start().catch((err) => {
        logger.error(err);
    });
}



